package juc.day02;

import java.util.ArrayList;
import java.util.concurrent.*;

/*
线程池:提供了一个线程队列，队列中保存着所有等待状态的线程。避免了创建与销毁的额外开销
        提供了响应速度
线程池的体系结构：
        java.util.concurrent.Executor:负责线程使用于调用的根接口
        |--**ExecutorService子接口：线程池的主要接口
            |--ThreadPoolExecutor线程池的实现类
            |--ScheduledExecutorService子接口：负责线程的调度
                |--ScheduledThreadPoolExecutor：继承了ThreadPoolExecutor，实现了ScheduledExecutorService
工具类：Executors
    ExecutorService newFixedThreadPool()：创建固定大小的连接池
    ExecutorService newCacheThreadPool()：缓存线程池，线程池的数量不固定，可以根据需求自动的更改数量
    ExecutorService new SingleThreadExecutor()：创建单个线程池。线程池中只有一个线程

    ScheduledExecutorService newScheduledThreadPool()：创建固定大小的线程池，可以延迟或定时执行任务


 */
public class TestThreadPool {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //创建一个线程池
        ExecutorService pool = Executors.newFixedThreadPool(5);
        ArrayList<Future<Integer>> list = new ArrayList<Future<Integer>>();
        for (int i = 0; i < 10; i++) {
            Future<Integer> futureTask = pool.submit(new Callable<Integer>() {
                @Override
                public Integer call() throws Exception {
                    int sum = 0;
                    for (int i = 1; i <= 100; i++) {
                        sum += i;
                    }
                    return sum;
                }
            });
            list.add(futureTask);
        }


//        ThreadPool threadPool = new ThreadPool();
//
//        //为线程池中的线程分配任务
//        for (int i = 0;i < 10; i++){
//            pool.submit(threadPool);
//        }
//        pool.submit(threadPool);

        /*关闭线程池
        shutdown()：以平和的方法关闭线程池，即等待所有线程执行完任务之后再关闭，不接受新任务
        shutdownNow()：直接关闭线程，无论是否执行完毕
         */
        pool.shutdown();

        for (Future<Integer> future : list) {
            System.out.println(future.get());
        }


        //        new Thread(pool).start();
//        new Thread(pool).start();
//        new Thread(pool).start();
    }
}


class ThreadPool implements Runnable {

    private int i = 0;

    @Override
    public void run() {
        while (i <= 100) {
            System.out.println(Thread.currentThread().getName() + " : " + i++);
        }
    }
}
